home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / comm / mail / Mutt089src.lha / Mutt-0.89i-AMIGA / src / copy.c < prev    next >
C/C++ Source or Header  |  1998-01-28  |  4KB  |  140 lines

  1. /*
  2.  * Copyright (C) 1996-8 Michael R. Elkins <me@cs.hmc.edu>
  3.  * 
  4.  *     This program is free software; you can redistribute it and/or modify
  5.  *     it under the terms of the GNU General Public License as published by
  6.  *     the Free Software Foundation; either version 2 of the License, or
  7.  *     (at your option) any later version.
  8.  * 
  9.  *     This program is distributed in the hope that it will be useful,
  10.  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *     GNU General Public License for more details.
  13.  * 
  14.  *     You should have received a copy of the GNU General Public License
  15.  *     along with this program; if not, write to the Free Software
  16.  *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  */ 
  18.  
  19. #include "mutt.h"
  20. #include "mailbox.h"
  21. #include "mx.h"
  22. #include "copy.h"
  23. #include <string.h>
  24. #include <stdlib.h>
  25.  
  26. /* make a copy of a message
  27.  *
  28.  * fpout    where to write output
  29.  * fpin        where to get input
  30.  * hdr        header of message being copied
  31.  * body        structure of message being copied
  32.  * flags
  33.  *    M_CM_NOHEADER    don't copy header
  34.  *    M_CM_PREFIX    quote header and body
  35.  *    M_CM_DECODE    decode message body to text/plain
  36.  *    M_CM_DISPLAY    displaying output to the user
  37.  * chflags    flags to mutt_copy_header()
  38.  */
  39.  
  40. int
  41. _mutt_copy_message (FILE *fpout, FILE *fpin, HEADER *hdr, BODY *body,
  42.             int flags, int chflags)
  43. {
  44.   STATE s;
  45.  
  46.   if ((flags & M_CM_NOHEADER) == 0)
  47.   {
  48.     if (flags & M_CM_PREFIX)
  49.       chflags |= CH_PREFIX;
  50.     if (mutt_copy_header (fpin, hdr, fpout, chflags) == -1)
  51.       return -1;
  52.   }
  53.  
  54.   if (flags & M_CM_DECODE)
  55.   {
  56.     /* now make a text/plain version of the message */
  57.     memset (&s, 0, sizeof (STATE));
  58.     s.fpin = fpin;
  59.     s.fpout = fpout;
  60.     if (flags & M_CM_PREFIX)
  61.       s.prefix = Prefix;
  62.     if (flags & M_CM_DISPLAY)
  63.       s.flags |= M_DISPLAY;
  64.  
  65.  
  66.  
  67. #ifdef _PGPPATH
  68.     if (flags & M_CM_VERIFY)
  69.       s.flags |= M_VERIFY;
  70. #endif
  71.  
  72.  
  73.  
  74.     mutt_body_handler (body, &s);
  75.   }
  76.   else
  77.   {
  78.     fseek (fpin, body->offset, 0);
  79.     if (mutt_copy_bytes (fpin, fpout, body->length) == -1)
  80.       return -1;
  81.   }
  82.   return 0;
  83. }
  84.  
  85. int
  86. mutt_copy_message (FILE *fpout, CONTEXT *src, HEADER *hdr, int flags,
  87.            int chflags)
  88. {
  89.   MESSAGE *msg;
  90.   int r;
  91.   
  92.   if ((msg = mx_open_message (src, hdr->msgno)) == NULL)
  93.     return -1;
  94.   r = _mutt_copy_message (fpout, msg->fp, hdr, hdr->content, flags, chflags);
  95.   mx_close_message (&msg);
  96.   return r;
  97. }
  98.  
  99. /* appends a copy of the given message to a mailbox
  100.  *
  101.  * dest        destination mailbox
  102.  * fpin        where to get input
  103.  * src        source mailbox
  104.  * hdr        message being copied
  105.  * body        structure of message being copied
  106.  * flags    mutt_copy_message() flags
  107.  * chflags    mutt_copy_header() flags
  108.  */
  109.  
  110. int
  111. _mutt_append_message (CONTEXT *dest, FILE *fpin, CONTEXT *src, HEADER *hdr,
  112.               BODY *body, int flags, int chflags)
  113. {
  114.   MESSAGE *msg;
  115.   int r;
  116.  
  117.   if ((msg = mx_open_new_message (dest, hdr, (src->magic == M_MBOX || src->magic == M_MMDF) ? 0 : M_ADD_FROM)) == NULL)
  118.     return -1;
  119.   if (dest->magic == M_MBOX || dest->magic == M_MMDF)
  120.     chflags |= CH_FROM;
  121.   chflags |= (dest->magic == M_MAILDIR ? CH_NOSTATUS : CH_UPDATE);
  122.   r = _mutt_copy_message (msg->fp, fpin, hdr, body, flags, chflags);
  123.   mx_close_message (&msg);
  124.   return r;
  125. }
  126.  
  127. int
  128. mutt_append_message (CONTEXT *dest, CONTEXT *src, HEADER *hdr, int cmflags,
  129.              int chflags)
  130. {
  131.   MESSAGE *msg;
  132.   int r;
  133.  
  134.   if ((msg = mx_open_message (src, hdr->msgno)) == NULL)
  135.     return -1;
  136.   r = _mutt_append_message (dest, msg->fp, src, hdr, hdr->content, cmflags, chflags);
  137.   mx_close_message (&msg);
  138.   return r;
  139. }
  140.